//package com.adee.jdk9;
//
//import java.lang.invoke.MethodHandles;
//import java.lang.invoke.VarHandle;
//
//public class Test001_VarHandle {
//    private String plainStr;    //普通变量
//    private static String staticStr;    //静态变量
//    private String reflectStr;    //通过反射生成句柄的变量
//    private String[] arrayStr = new String[10];    //数组变量
//    private volatile String volatileStr; // volatile变量
//    private String casStr; // 需要cas操作的变量
//
//    private static final VarHandle plainVar;    //普通变量句柄
//    private static final VarHandle staticVar;    //静态变量句柄
//    private static final VarHandle reflectVar;    //反射字段句柄
//    private static final VarHandle arrayVar;    //数组句柄
//    private static final VarHandle volatileVar; // volatile变量句柄
//    private static final VarHandle casVar; // cas变量句柄
//
//    static {
//        try {
//            MethodHandles.Lookup l = MethodHandles.lookup();
//            plainVar = l.findVarHandle(Test001_VarHandle.class, "plainStr", String.class);
//            staticVar = l.findStaticVarHandle(Test001_VarHandle.class, "staticStr", String.class);
//            reflectVar = l.unreflectVarHandle(Test001_VarHandle.class.getDeclaredField("reflectStr"));
//            arrayVar = MethodHandles.arrayElementVarHandle(String[].class);
//            volatileVar = l.findVarHandle(Test001_VarHandle.class, "volatileStr", String.class);
//            casVar = l.findVarHandle(Test001_VarHandle.class, "casStr", String.class);
//        } catch (ReflectiveOperationException e) {
//            throw new ExceptionInInitializerError(e);
//        }
//    }
//    public static void main(String[] args) {
//        Test001_VarHandle t1 = new Test001_VarHandle();
//        t1.test();
//    }
//
//    public void test() {
//        // 1、简单的read/write访问
//        plainVar.set(this, "I am a plain string");    //实例变量的普通write操作
//        staticVar.set("I am a static string");    //    静态变量的普通write操作
//        reflectVar.set(this, "I am a string created by reflection");    //反射字段的普通write操作
//        arrayVar.set(arrayStr, 0, "I am a string array element");    //数组变量的普通write操作
//
//        String plainString = (String) plainVar.get(this);    //实例变量的普通read操作
//        String staticString = (String) staticVar.get();    //    静态变量的普通read操作
//        String reflectString = (String) staticVar.get(this);    //反射字段的普通read操作
//        String arrayStrElem = (String) arrayVar.get(arrayStr, 0);    //数组变量的普通read操作， 第二个参数是指数组下标，即第0个元素
//        // 2、volatile read/write访问
//        volatileVar.setVolatile(this, "I am volatile string");    //volatile write
//        String volatileString = (String) volatileVar.get(this);    //volatile read
//        // 3、CAS访问
//        String casString = (String) casVar.get(this);    //先读取当前值作为cas的预期值
//        casVar.compareAndSet(this, casString, "I am a new cas string");    //第二个参数为预期值，第三个参数为修改值
//    }
//}
